import pandas as pd
import numpy as nm

import sparseAugment as sa
import randomAugment as ra
import resultProcess as rp

# 整体方法说明
# 1、读入交互数据文档
# 2、从交互数据中建立两个邻接矩阵，分别是interacted和liked
#    前者是算最终结果用的，没阈值要求；后者是一开始算权重用的，有阈值要求；详见相关代码；
# 3、基于liked_graph先算出一个权重矩阵weights
# 4、在liked_graph基础上提取稀疏子图sparse_liked_graph（需要开发）
# 5、重复上边的计算，得到稀疏权重矩阵sparse_weights（需要开发）
# 6、把两个权重矩阵加起来，得到sum_weights（需要开发）
# 7、基于sum_weights得到信息扩散后的结果，保存为新的csv（需要开发）

# ==============第一部分：基本数据集的指定===================
# 指定数据集的名字和规模，并读取
# data_name = 'fsl'
data_name = 'dvd'
# data_name = 'ml'
# data_num = '1k'
# data_num = '5k'
data_num = '1w'
print('读取文件：{}-{}'.format(data_name, data_num))

# 拿出初始交互数据
original_interactions = pd.read_csv('../datasets/{}/{}-{}.csv'.format(data_name, data_name, data_num))

# ==============第二部分：数据集的初步加工===================
# 求出用户数和项目数
num_of_user = len(list(set(original_interactions['userid'])))
num_of_item = len(list(set(original_interactions['itemid'])))
print('num of user:', num_of_user)
print('num of item:', num_of_item)
# 创建已交互矩阵，有交互行为就算
interacted_graph = nm.zeros([num_of_item, num_of_user])
# 创建喜欢图邻接矩阵，超过阈值的交互才算喜欢
liked_graph = nm.zeros([num_of_item, num_of_user])

# 根据评分对矩阵进行初始化
# 不切分训练集和测试集，都放进矩阵里
# 注意行号是项目id，列号是用户id，都是从0开始的
# interacted_graph装用户和项目交互
# liked_graph装的是评分超过阈值的交互记录，这里阈值是3
for index, row in original_interactions.iterrows():
    interacted_graph[int(row[1]), int(row[0])] = 1
    if int(row[2]) >= 3.0:
        liked_graph[int(row[1]), int(row[0])] = 1

inter_nozero_count = nm.count_nonzero(interacted_graph)
liked_nozero_count = nm.count_nonzero(liked_graph)
print('interacted_graph非0元素：', inter_nozero_count)
print('liked_graph非零元素：', liked_nozero_count)

# ==============第三部分：随机增强与资源矩阵计算===================
# 生成随机增强矩阵
random_augment_liked_graph = ra.random_graph_augment(liked_graph)
# 看看随机增强矩阵里非零值的情况
random_liked_nozero_count = nm.count_nonzero(random_augment_liked_graph)
print('random_augment_liked_graph非0元素：', random_liked_nozero_count)
# 基于随机增强矩阵计算资源分配矩阵
ra_weights = ra.random_weights_compute(num_of_item, num_of_user, random_augment_liked_graph)
# 看看分配矩阵里非零值的情况
ra_weights_nozero_count = nm.count_nonzero(ra_weights)
print('ra_weights非0元素：', ra_weights_nozero_count)

# ==============第四部分：稀疏增强与资源矩阵计算===================
# 生成稀疏增强子图
sparse_liked_graph = sa.sparse_graph_augment(num_of_item, num_of_user, liked_graph)
# 基于稀疏增强计算资源分配矩阵
sparse_weights = sa.sparse_weights_compute(num_of_item, num_of_user, sparse_liked_graph)
# 看看结果里非零元素的数量
sparse_weights_nozero_count = nm.count_nonzero(sparse_weights)
print('sparse_weights非0元素：', sparse_weights_nozero_count)

# ==============第五部分：基于资源分配矩阵得到输出===================
# 基于权重分配矩阵计算得到增强后的结果
# 计算得到的是三种结果：随机增强结果，稀疏增强结果，随机+稀疏增强结果
results = rp.result_compute(ra_weights, sparse_weights, interacted_graph)

# 把三种结果分别保存不同的csv
rp.result_export(original_interactions, results, data_name, data_num)
